/* 
 * File:   queue.h
 * Author: landry
 *
 * Created on 10 octobre 2009, 09:08
 */

#ifndef _QUEUE_H
#define	_QUEUE_H


#include "client.h"
#include "serveur.h"
#include "evenement.h"
#include "statistique.h"
#include "chronologie.h"
#include "outil.h"
//#include "globalVariables.h"
//#include "externalVariable.h"
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <list>


using namespace std;


extern "C++" int numeroEvenement;
extern "C++" list<Evenements> ListeEvenements;
extern "C++" list<CLIENTS> clients;
extern "C++" Horloge horlogeSysteme;
extern "C++" int time_for_end;
extern "C++" bool cont;
extern "C++" int nbre_client_servi;
extern "C++" int nbre_client_limite;
extern "C++" int arret;

//arret = (char*)malloc(sizeof(char)*3);

class Queue {
public:

    //extern list<CLIENTS> clients;

    //liste de tous les clients dans le systeme
    
    Queue();
    Queue(const Queue& orig);

    Queue(int number_of_server);


    //initialise les statistiques
    void initStatistique();


    void init(){
        horlogeSysteme.initHorloge();
       // initServerList();
        initStatistique();
        horlogeSysteme.updeteHorloge();
    }

    void endEvent();

    //int nbrClient_queued;

    //initialise la file d'attente
    void initQueue(int time_last_arrival,int elaps_time_last_departure,int time_to_new_departure);

    void setTimeLastArrival(int time_last_arrival){
        this->time_last_arrival = time_last_arrival;
    }
    void setElapsTimeLastDeparture(int elaps_time_last_departure){
        this->elaps_time_last_departure = elaps_time_last_departure;
    }
    void setTimetoNewDeparture(int time_to_new_departure){
        this->time_to_new_departure = time_to_new_departure;
    }
    void setQueueLength(int queue_length){
        this->queue_length = queue_length;
    }
    void setNumberOfServer( int number_of_server){
        this->number_of_server = number_of_server;
    }

    int getTimeLastArrival(){
        return this->time_last_arrival;
    }
    int getElapsTimeLastDeparture(){
        return this->elaps_time_last_departure;
    }
    int getTimetoNewDeparture(){
        return this->time_to_new_departure;
    }
    int getQueueLength(){
        return this->queue_length;
    }
    int setNumberOfServer(){
        return this->number_of_server;
    }

    //Operations sur la file d'attente des clients 
    void addClient(CLIENTS client);
    void removeClient();
    //void removeClient(Client client);


    //Operation pour la creation des statistiques
    void createStatistic();

    /* Operations sur la liste des serveurs
     ajoute un serveur a la liste des serveurs disponible */
    //initialise la liste des serveurs

   // void initServerList();
   // void addServer(SERVEUR server);
    
    // renvoie le numero d'un serveur libre et -1 dans le cas contraire
   // int server_free();

    //Operations sur la liste des evenements
    //void addEvent(Evenements event);
    //void removeEvent();
    //void sortListEvent();
    //operations realisee losrque l'on recoie un nouvel evenement selon le type
    void proccessEvent(Evenements event);

    void displayStat(char* output_file);

    void AverageClientsQueued();

    int longueurMaxfile();

   

   // void sortListEvent();
    

    virtual ~Queue();
private:




    list<CLIENTS> clientList; //il s'agit ici de la file d'attente des clients dans le systeme
    SERVEUR serverList[10];
    //Statistiques collectees a differets etats du systeme
    list<Statistiques> listStatistic;
    //Liste des evenements

    //variable externe donc globale au programme
   
    int nbrClient_queued;

    int time_last_event;

    //vector<Evenement> eventList;
    // L'instant dont s'est produit le dernier evenement
    int time_last_arrival;
    // Le temps ecoule depuis le dernier depart
    int elaps_time_last_departure;
    // Le temps restant a ecouler jusqu'au prochain depart
    int time_to_new_departure;
    // longuer de la file d'attente
    int queue_length;
    // nombre de serveurs
    int number_of_server;

    int time_in_queue;

    //donne a chaque instant le nombre de clients reste dans la queue
    //Cette valeur est egale a :
    //valeur precedente += longueur_file_attente*nombre_serveurs_occupe
    int client_stayed_in_queued;

    int nbre_cli_servi;

    int durre_occup_serveur;

    int nbre_serveur_occupee;
    //extern vector<Client> clients;

};

#endif	/* _QUEUE_H */

